local reasoning
関数の外部依存は全て引数で受け取るスタイル
例
code:ts
const data = {
count: 0
}
// 引数を使わず、コンテキスト外の値に依存している。dataの状態や文脈に依存するので扱いづらい
const increment = () => {
data.count++
}
---
// 引数にのみ依存させることでdataの構築方法を分離できる
// tsではオプショナルパラメータで実現できる
const increment = (data = data) => {
return { ...data, count: data.count + 1 }
}
DIの目的で、依存オブジェクトを後で入れ替えられるんです、というのを主においてしまうと、実際には大半のオブジェクトは入れ替える必要はないので、ピンとこなくなってしまうのではないかな。DIで本当に重要なのは、local reasoningだと思ってます。
関数型言語がDIがあまり話題にならないのは、そもそも関数型のスタイルによってlocal reasoningが確保されるからだと思います。参照透明な関数であれば、処理が依存するものは全て引数(と型)で表現されるので、広い意味では特に意識はせずとも引数でDIしていると捉えられる。
DIでのlocal reasoningの意義はtaroleoさんのairframe-diの記事だと「何を効果的に忘れられるか」と表現されてますね。これもすごくいい記事です。